#include "../echo.pb.h"
#include "tinyrpc/rpc/rpcclient/rpcclient.h"
#include "tinyrpc/rpc/rpcclient/rpcRequestInfo.h"
#include <boost/lexical_cast.hpp>
#include <iostream>
#include <functional>
#include "tinyrpc/base/lexicalCast.hpp"
int main(){
    TinyRPC::Logger::SetLogLevel(TinyRPC::LogLevel::DEBUG);
    TinyRPC::TinyRPCClient* client  = new TinyRPC::TinyRPCClient(2);
    client->init("/media/10T/zhouxiang/CPP-Projects/TinyRPC/test/base/conf.txt");
    echo::EchoServiceRpc_Stub stub(client);
    client->registServiceStub(&stub);

    // 同步调用
    echo::EchoMessage request;
    request.set_code(1);
    request.set_msg("hello");
    echo::EchoMessage response;
    // 需要自己定义一个echo_func 来封装 Protobuf 的Stub 方法
    auto echo_func = [&](const echo::EchoMessage* req, echo::EchoMessage* resp){
        stub.echo(nullptr, req, resp, nullptr);
    };

    // 异步调用的两种方式
    //TinyRPC::RPCRequestInfoPtr future_response = client->async_call<const echo::EchoMessage, echo::EchoMessage>(echo_func, request);
    // future_response->getResponse<echo::EchoMessage>();


    // std::cout<<response_async.msg()<<std::endl;
    // TinyRPC::Future<echo::EchoMessage> future_response2 = client->async_call<const echo::EchoMessage, echo::EchoMessage>("EchoServiceRpc","echo", request);
    // future_response2.get();

    // 同步调用的三种方式
    // echo::EchoMessage response2 = client->call<const echo::EchoMessage, echo::EchoMessage>(echo_func, request);
    //echo_func(&request, &response);
    long index = 0;
    while (1)
    {
        for(int i=0; i<1000; i++){
            std::string str = "hello" + boost::lexical_cast<std::string, long>(index++);
            LOG_DEBUG<<str;
            request.set_msg(str);
            echo::EchoMessage response3 = client->call<const echo::EchoMessage, echo::EchoMessage>("EchoServiceRpc","echo", request);

            LOG_DEBUG<<"response: "<<response3.msg();
        }
        //sleep(5);
    }
    
    // echo::EchoMessage response3 = client->call<const echo::EchoMessage, echo::EchoMessage>("EchoServiceRpc","echo", request);
    // std::cout<<response3.msg()<<std::endl;
}